package myLoger

import (
	"fmt"
	"os"
	"path"
	"time"
)

//LogerFile  用于将日志信息输出到文件
/**
  FileLimitSize 表示文件最大限制(单位：B)，0表示不限制
  FileName 表示文件名
  FilePath 表示文件输出路径
*/
type LogerFile struct {
	FileLimitSize int64
	FileName      string
	FilePath      string
}

func (l *LogerFile) output(logger *Logger, curTime string, file string, line int) {
	fileObj, err := os.OpenFile(l.FileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		fmt.Printf("创建文件失败:%v", err)
		return
	}
	overFileSizeLimit, err := l.checkFileSize(fileObj)
	if err != nil {
		fmt.Printf("%v", err)
	}
	if overFileSizeLimit { //超过尺寸
		//1. 就把这个文件关闭后
		fileObj.Close()
		//2. 这个文件重命名后
		timeStamp := time.Now().Format("20060102150405")
		newFileName := fmt.Sprintf("%v-%s", l.FileName, timeStamp)

		filePath := path.Join(l.FilePath, l.FileName)
		newFilePath := path.Join(l.FilePath, newFileName)
		//Rename参数是oldPath，newPath,新旧文件路径相同，相当于重命名
		err := os.Rename(filePath, newFilePath)
		if err != nil {
			fmt.Printf("创建分割文件失败：%v", err)
		}
		//3. 建立一个新的文件，写入日志
		timeStamp = time.Now().Format("20060102150405")
		newFileName = fmt.Sprintf("%v-%s", l.FileName, timeStamp)
		newFileObj, _ := os.OpenFile(newFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
		fmt.Fprintf(newFileObj, "[错误等级：%v] [触发时间:%v] [错误位置:<文件：%v> <行号：%v>] \n", parse(logger.curLogLevel), curTime, file, line)
	} else { //未超过，就写日志
		fmt.Fprintf(fileObj, "[错误等级：%v] [触发时间:%v] [错误位置:<文件：%v> <行号：%v>] \n", parse(logger.curLogLevel), curTime, file, line)
	}

}

// checkFileSize  如果文件超过限制，返回true
func (l *LogerFile) checkFileSize(file *os.File) (bool, error) {
	fileInfo, err := file.Stat()
	if err != nil {
		return false, fmt.Errorf("检查文件是否超过限制失败：%w", err)
	}
	fileSize := fileInfo.Size() //文件的长度（单位B，字节）
	if fileSize > l.FileLimitSize {
		return true, nil
	}
	return false, nil

}
